package pe.com.hermes.hermetic.web.controller.consultas;

import pe.com.hermes.hermetic.beans.AuditBean;
import pe.com.hermes.hermetic.beans.DenominacionMonedaBean;
import pe.com.hermes.hermetic.beans.SolicitudPedidosBean;
import pe.com.hermes.hermetic.beans.SucursalBean;
import pe.com.hermes.hermetic.beans.TiposBean;
import pe.com.hermes.hermetic.negocio.service.HermeticFacade;
import pe.com.hermes.hermetic.negocio.service.PedidoService;
import pe.com.hermes.hermetic.web.controller.base.IController;

import pe.com.hermes.hermetic.web.controller.general.MostrarReporteController;
import pe.com.hermes.hermetic.web.forms.HMF3007Form;

import pe.com.hermes.hermetic.negocio.ultil.ConstantesHermetic;
import pe.com.hermes.hermetic.negocio.ultil.Util;

import pe.com.hermes.hermetic.web.controller.base.IWebOpciones;

import java.io.InputStream;
import java.io.OutputStream;

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import java.util.Map;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

import org.apache.log4j.Logger;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;

@Controller
@SessionAttributes(value={"codOpci","desOpci"})
@RequestMapping("/mostrarHWF3007.html")
public class ListarPedidoController implements IController{
    protected final static Logger logger = Logger.getLogger(ListarPedidoController.class);
    @Autowired
    private HermeticFacade servicioHermetic;
    @Autowired
    private MostrarReporteController reporteFactory;
    @Autowired
    private PedidoService pedidoService;
    
    
    @RequestMapping(method=RequestMethod.GET)    
    protected String showForm(ModelMap model,HttpServletRequest request) throws Exception{
       HMF3007Form form = new HMF3007Form();
       String cliente = (String)request.getSession(false).getAttribute("cliente");
       String sucursal = (String)request.getSession(false).getAttribute("sucursal");
       request.getSession(false).removeAttribute("_chk");
       form.setExisteCliDest(servicioHermetic.validaClientesDestino(cliente));
       form.setExisteMatriz(servicioHermetic.getIsMatrizActive(cliente,sucursal) );
       List listadoTiposDestino = servicioHermetic.getTipoDestino();
       List listaTipos = servicioHermetic.getTipoPedido();
       String fecha = servicioHermetic.getFechaHoy();
       form.setFechadesde(fecha);
       form.setFechahasta(fecha);
       form.setFormulario("HMR3007");
       List listSucursales = servicioHermetic.getSucursales();
       request.getSession(false).removeAttribute("chks");
       AuditBean auditBean = new AuditBean(LIST_PEDI);
       servicioHermetic.inseAudit(auditBean);
       model.put("listadoTiposDestino",listadoTiposDestino);
       model.put("listaTipos",listaTipos);
       model.put("listSucursales",listSucursales);
       String codOpci = IWebOpciones.LIST_PEDI;
       String desOpci = servicioHermetic.getDesOpci(codOpci, request);
       model.put("codOpci",codOpci);
       model.put("desOpci",desOpci);
       model.put(FORM_KEY,form);
       return  FORM_LIST_PEDI;
    }
    @RequestMapping(params="accion=mostrar")    
    protected String listarPedidos(ModelMap model,@ModelAttribute(FORM_KEY) HMF3007Form form,HttpServletRequest request) throws Exception{       
       form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
       HttpSession session = request.getSession(false);
       String cliente = (String)request.getSession(false).getAttribute("cliente");
       String sucursal = (String)request.getSession(false).getAttribute("sucursal");
       form.setExisteCliDest(servicioHermetic.validaClientesDestino(cliente));
       form.setExisteMatriz(servicioHermetic.getIsMatrizActive(cliente,sucursal) );
       List listadoTiposDestino = servicioHermetic.getTipoDestino();
       List listaTipos = servicioHermetic.getTipoPedido(); 
       String listMatrices = "0";
       if(form.getCodMatriz()==null)
        form.setCodMatriz("");
       if(form.getCodMatriz().equals("1"))
            listMatrices = Util.arrayToString((String[])session.getAttribute("chks"),",");
       List listaModulos;
       List listMontos;
       try {
            listaModulos = 
                servicioHermetic.getSolicitudPedidos(form.getFechadesde(), 
                                                           form.getFechahasta(), 
                                                           cliente, 
                                                           form.getTipo(), 
                                                           sucursal, 
                                                           form.getTipoDestino(),listMatrices);
    
            listMontos = new ArrayList();
        
            if (listaModulos != null) {
                DecimalFormatSymbols dfs = new DecimalFormatSymbols();
                dfs.setDecimalSeparator('.');
                dfs.setGroupingSeparator(',');
                DecimalFormat df1 = new DecimalFormat("###,###,##0.00", dfs);
                df1.setGroupingSize(3);
                List listUnidMone = servicioHermetic.getTipoUniMone();
                
                for(Iterator iter = listUnidMone.iterator(); 
                         iter.hasNext(); ){
                    TiposBean unid_mone =(TiposBean)iter.next();
                    DenominacionMonedaBean monto = new DenominacionMonedaBean();
                    double suma = 0;
                    for(Iterator ite = listaModulos.iterator();ite.hasNext();){
                        SolicitudPedidosBean bean = (SolicitudPedidosBean)ite.next();
                        if(bean.getTip_unid_mone().equalsIgnoreCase(unid_mone.getCodigo())){
                            suma = suma + Double.parseDouble(bean.getMon_pedi().replaceAll(",", 
                                                                                             ""));
                        }    
                    }
                    if(suma!=0.00){
                        monto.setCodDenominacion(unid_mone.getCodigo());
                        monto.setMensaje(unid_mone.getDescripcion());
                        monto.setMontoDeno(df1.format(suma));
                        listMontos.add(monto);
                    }
                }
            }
        }
        catch (Exception e) {
            logger.error(e);
            listaModulos = new ArrayList();
            listMontos = new ArrayList();
        }
       session.setAttribute("listaModulos",listaModulos); 
       model.put("listaModulos",listaModulos); 
       model.put("listMontos", listMontos); 
       model.put("listadoTiposDestino",listadoTiposDestino);
       model.put("listaTipos",listaTipos);
       model.put(FORM_KEY,form);
       return  FORM_LIST_PEDI;
    }
    @RequestMapping(params="accion=mostrarReporte")
    protected void mostrarReporte(ModelMap model,@ModelAttribute(FORM_KEY) HMF3007Form form,HttpServletRequest request ,HttpServletResponse response)throws Exception{
        HttpSession session = request.getSession(false);
        List listSocitudPedidos = (List)session.getAttribute("listaModulos");
        String nombreCliente = (String)session.getAttribute("nombreCliente");
        
        form.setNomCliente(nombreCliente);
        form.setListSolicitudPedidos(listSocitudPedidos);
        String rutaJasper = session.getServletContext().getInitParameter("rutajasper");
        StringBuffer jasperPath = new StringBuffer(rutaJasper).append("/").append(form.getFormulario()).append(".jasper");
        Map map = new HashMap();
        JRDataSource simpleDS;
        String fecha_srv = servicioHermetic.getFechaHoy();
        String hora_srv = servicioHermetic.getFecha2().substring(8, 13);
        simpleDS = new JRBeanCollectionDataSource(form.getListSolicitudPedidos());
        map.put("nomClie",form.getNomCliente());
        map.put("existeMatriz", form.isExisteMatriz());
        map.put("fec_soli_pedi1",form.getFechadesde());
        map.put("fec_soli_pedi2",form.getFechahasta());
        map.put("fecha_srv",fecha_srv);
        map.put("hora_srv",hora_srv);
        map.put("tip_destino",form.getTipoDestino());
        map.put("contextPath",request.getSession().getServletContext().getRealPath("/"));
        ServletOutputStream servletOutputStream = response.getOutputStream();
        InputStream reportStream = session.getServletContext().getResourceAsStream(jasperPath.toString());
        byte[] bytes = null;        
        bytes = JasperRunManager.runReportToPdf(reportStream, map, simpleDS);
        response.setHeader("Cache-Control","cache"); // HTTP 1.1
        response.setHeader("Pragma","cache"); // HTTP 1.0
        response.setDateHeader ("Expires", -1);         
        response.setContentType("application/pdf");
        response.addHeader("Content-Disposition", "inline; filename=Reporte.pdf");        
        response.setContentLength(bytes.length);         
        servletOutputStream.write(bytes, 0, bytes.length);
        servletOutputStream.flush();
        servletOutputStream.close();
        
    }
    @RequestMapping(params="accion=mostrarExcel")
    protected void mostrarExcel(ModelMap model,@ModelAttribute(FORM_KEY) HMF3007Form form,HttpServletRequest request ,HttpServletResponse response)throws Exception{
        List listSocitudPedidos = (List)request.getSession(false).getAttribute("listaModulos");
        String nombreCliente = (String)request.getSession(false).getAttribute("nombreCliente");
        form.setNomCliente(nombreCliente);
        form.setListSolicitudPedidos(listSocitudPedidos);
        HSSFWorkbook wb = new HSSFWorkbook(); 
        wb=pedidoService.excelListadoPedido(form);
        response.addHeader("Content-type", "application/vnd.ms-excel");
        response.addHeader("Content-Disposition", "attachment; filename=listReportUsuarios.xls");
        response.setContentType("Content-type: application/vnd.ms-excel");
        
        response.setHeader("Cache-Control","cache"); // HTTP 1.1
        response.setHeader("Pragma","cache"); // HTTP 1.0
        response.setDateHeader ("Expires", -1);  
        
        OutputStream out = response.getOutputStream();
        wb.write(out);
        out.close();
    }
    @RequestMapping(params="accion=seleccionarMatrices")
    protected String cargarMatrices(ModelMap model,@ModelAttribute(FORM_KEY) HMF3007Form form,HttpServletRequest request) throws Exception{
        HttpSession session = request.getSession(false);
        List listadoTiposDestino = servicioHermetic.getTipoDestino();
        List listaTipos = servicioHermetic.getTipoPedido();
        form.set_chk((String[])session.getAttribute("_chk"));
        model.put("listadoTiposDestino",listadoTiposDestino);
        model.put("listaTipos",listaTipos);
        model.put(FORM_KEY,form);
        return FORM_LIST_PEDI;
    }
    @RequestMapping(params="accion=showMatrices")
    public @ResponseBody Map showMatrices(){
        Map map = new HashMap();
        Map row = new HashMap();
        Map rows = new HashMap();
        List listSucursales = servicioHermetic.getSucursales(); 
        SucursalBean[] sucursal = new SucursalBean[listSucursales.size()];
        listSucursales.toArray(sucursal);
        /*
         * for(Object object:listSucursales){
            SucursalBean sucursalBean = (SucursalBean)object;
            row.put("id",sucursalBean.getCodSucursal());
            rows.put("cell",new String[]{sucursalBean.getCodSucursal(),sucursalBean.getDesSucursal()});
        }
        */
        logger.info(sucursal.toString());
        map.put("page","1");
        map.put("total","16");
        map.put("records","5");
        map.put("rows",sucursal);
        return map;
    }
}